package org.sql.connector.operations;

// *************************************************************************/
// Charada Soft
// Area de Desarrollo de Sistemas de Información
// *************************************************************************/
// Proyecto : java connector sql
// Archivo : DataServer.java
// Descripcion : Clase DataServer
// *************************************************************************/
// Version : 2.0.4
// Fecha de Creación: 27 de Septiembre de 2014
// Author : Daniel Andres Castillo Pedroza
// *************************************************************************/

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.sql.connector.ServerManager;
import org.tools.datetime.Date;
import org.tools.datetime.Time;
import org.tools.datetime.exception.DateException;
import org.tools.datetime.exception.TimeException;

public class DataServer {

    // Metodos estáticos de la clase DataServer
    
    /**
     * Este método nos permite obtener la fecha de un Servidor de Base 
     * de Datos a traves de una conexión. Donde la conexión con el servidor se
     * establece con un objeto <code>Connection</code>.
     * 
     * @param connection Conexión con el servidor de Base de Datos
     * @return Retorna la fecha en un objeto <code>String</code>.
     * @throws SQLException Se ejecutara esta excepcion si hay problemas con la conexión.
     */
    public static String getDateString(Connection connection) throws SQLException {
        String dateOfServer = null; // Fecha a retornar en el Servidor
        Statement statement = connection.createStatement();
        
        ResultSet resultSet = statement.executeQuery("SELECT CURDATE() AS FECHA");
        
        if (resultSet.next()) {
            dateOfServer = resultSet.getString("FECHA");
        } // Se establece la fecha del Servidor
        
        resultSet.close(); statement.close(); // Cerrando objetos de Proceso
        
        return dateOfServer; // Retornando Fecha del Servidor
    }

    /**
     * Este método nos permite obtener la fecha de un Servidor de Base de Datos.
     * Donde el tipo de servidor se establece con un objeto <code>ServerManager</code>.
     * 
     * @param serverManager Tipo de Servidor para obtener la Fecha
     * @return Retorna la fecha en un objeto <code>String</code>.
     * @throws SQLException Se ejecutara esta excepcion si hay problemas con el Servidor.
     */
    public static String getDateString(ServerManager serverManager) throws SQLException {
        String dateOfServer = null; // Fecha a retornar en el Servidor

        if (serverManager.isConnect()) {
            dateOfServer = getDateString(serverManager.getConnection());
        } // Conectado con el Servidor SQL establecido

        return dateOfServer; // Retornando Fecha del Servidor
    }
    
    /**
     * Este método nos permite obtener la fecha de un Servidor de Base 
     * de Datos a traves de una conexión. Donde la conexión con el servidor se
     * establece con un objeto <code>Connection</code>.
     * 
     * @param connection Conexión con el servidor de Base de Datos
     * @return Retorna la fecha en un objeto <code>Date</code>.
     * @throws SQLException Se ejecutara esta excepcion si hay problemas con la conexión.
     */
    public static Date getDate(Connection connection) throws SQLException {
        try {
            return Date.create(getDateString(connection));
        } // No hay problemas al crear objeto fecha
        
        catch (DateException ex) {
            System.out.println(ex.getMessage()); return null;
        } // Ocurrio un error al crear la fecha
    }

    /**
     * Este método nos permite obtener la fecha de un Servidor de Base de Datos.
     * Donde el tipo de servidor se establece con un objeto <code>ServerManager</code>.
     * 
     * @param serverManager Tipo de Servidor para obtener la Fecha
     * @return Retorna la fecha en un objeto <code>Date</code>.
     * @throws SQLException Se ejecutara esta excepcion si hay problemas con el Servidor.
     */
    public static Date getDate(ServerManager serverManager) throws SQLException {
        try {
            return Date.create(getDateString(serverManager));
        } // No hay problemas al crear objeto fecha
        
        catch (DateException ex) {
            System.out.println(ex.getMessage()); return null;
        } // Ocurrio un error al crear la fecha
    }
    
    /**
     * Este método nos permite obtener el tiempo de un Servidor de Base 
     * de Datos a traves de una conexión. Donde la conexión con el servidor se
     * establece con un objeto <code>Connection</code>.
     * 
     * @param connection Conexión con el servidor de Base de Datos
     * @return Retorna el tiempo en un objeto <code>String</code>.
     * @throws SQLException Se ejecutara esta excepcion si hay problemas con la conexión.
     */
    public static String getTimeString(Connection connection) throws SQLException {
        String timeOfServer = null; // Dato a guardar la hora del Servidor
        Statement statement = connection.createStatement();
        
        ResultSet resultSet = statement.executeQuery("SELECT CURTIME() AS HORA");
        
        if (resultSet.next()) {
            timeOfServer = resultSet.getString("HORA");
        } // Se establece la hora del Servidor
        
        resultSet.close(); statement.close(); // Cerrando objetos de Proceso
        
        return timeOfServer; // Retornando la Tiempo del Servidor
    }

    /**
     * Este método nos permite obtener el tiempo de un Servidor de Base de Datos.
     * Donde el tipo de servidor se establece con un objeto <code>ServerManager</code>.
     * 
     * @param serverManager Tipo de Servidor para obtener el Tiempo
     * @return Retorna el tiempo en un objeto <code>String</code>.
     * @throws SQLException Se ejecutara esta excepcion si hay problemas con el Servidor.
     */
    public static String getTimeString(ServerManager serverManager) throws SQLException {
        String timeOfServer = null; // Fecha a retornar en el Servidor

        if (serverManager.isConnect()) {
            timeOfServer = getTimeString(serverManager.getConnection());
        } // Conectado con el Servidor SQL establecido

        return timeOfServer; // Retornando Tiempo del Servidor
    }
    
    /**
     * Este método nos permite obtener el tiempo de un Servidor de Base 
     * de Datos a traves de una conexión. Donde la conexión con el servidor se
     * establece con un objeto <code>Connection</code>.
     * 
     * @param connection Conexión con el servidor de Base de Datos
     * @return Retorna el tiempo en un objeto <code>Time</code>.
     * @throws SQLException Se ejecutara esta excepcion si hay problemas con la conexión.
     */
    public static Time getTime(Connection connection) throws SQLException {
        try {
            return Time.create(getTimeString(connection));
        } // No hay problemas al crear objeto tiempo
        
        catch (TimeException ex) {
            System.out.println(ex.getMessage()); return null;
        } // Ocurrio un error al crear la fecha
    }

    /**
     * Este método nos permite obtener el tiempo de un Servidor de Base de Datos.
     * Donde el tipo de servidor se establece con un objeto <code>ServerManager</code>.
     * 
     * @param serverManager Tipo de Servidor para obtener el Tiempo
     * @return Retorna el tiempo en un objeto <code>Time</code>.
     * @throws SQLException Se ejecutara esta excepcion si hay problemas con el Servidor.
     */
    public static Time getTime(ServerManager serverManager) throws SQLException {
        try {
            return Time.create(getTimeString(serverManager));
        } // No hay problemas al crear objeto tiempo
        
        catch (TimeException ex) {
            System.out.println(ex.getMessage()); return null;
        } // Ocurrio un error al crear la fecha
    }
}